package main

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/x509"
	"encoding/pem"
	"log"
	"os"
)

func main() {
	// 生成2048位的RSA密钥对
	privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
	if err != nil {
		log.Fatalf("生成密钥对失败: %v", err)
	}

	// 将私钥保存到PEM文件（PKCS#1标准）
	privateKeyBytes := x509.MarshalPKCS1PrivateKey(privateKey)
	privateKeyBlock := &pem.Block{
		Type:  "RSA PRIVATE KEY",
		Bytes: privateKeyBytes,
	}
	privateKeyFile, err := os.Create("pems/license_private_key.pem")
	if err != nil {
		log.Fatalf("创建私钥文件失败: %v", err)
	}
	defer privateKeyFile.Close()
	// 设置文件权限为仅当前用户可读
	if err := privateKeyFile.Chmod(0o600); err != nil {
		log.Fatalf("设置私钥文件权限失败: %v", err)
	}
	if err := pem.Encode(privateKeyFile, privateKeyBlock); err != nil {
		log.Fatalf("编码私钥到文件失败: %v", err)
	}
	log.Println("私钥已安全保存至 pems/license_private_key.pem")

	// 将公钥保存到PEM文件（PKIX标准）
	publicKeyBytes, err := x509.MarshalPKIXPublicKey(&privateKey.PublicKey)
	if err != nil {
		log.Fatalf("编码公钥失败: %v", err)
	}
	publicKeyBlock := &pem.Block{
		Type:  "PUBLIC KEY",
		Bytes: publicKeyBytes,
	}
	publicKeyFile, err := os.Create("pems/license_public_key.pem")
	if err != nil {
		log.Fatalf("创建公钥文件失败: %v", err)
	}
	defer publicKeyFile.Close()
	if err := pem.Encode(publicKeyFile, publicKeyBlock); err != nil {
		log.Fatalf("编码公钥到文件失败: %v", err)
	}
	log.Println("公钥已保存至 pems/license_public_key.pem")
	log.Println("✅ RSA密钥对生成成功！")
}
